# 上下文管理器(Context managers)
# 上下文管理器允许你在有需要的时候，精确地分配和释放资源。
#
# 使用上下文管理器最广泛的案例就是with语句了。
# 想象下你有两个需要结对执行的相关操作，然后还要在它们中间放置一段代码。
# 上下文管理器就是专门让你做这种事情的。举个例子：
#
# with open('some_file', 'w') as opened_file:
#     opened_file.write('Hola!')
# 上面这段代码打开了一个文件，往里面写入了一些数据，然后关闭该文件。如果在往文件写数据时发生异常，它也会尝试去关闭文件。上面那段代码与这一段是等价的：
#
# file = open('some_file', 'w')
# try:
#     file.write('Hola!')
# finally:
#     file.close()
# 当与第一个例子对比时，我们可以看到，通过使用with，许多样板代码(boilerplate code)被消掉了。 这就是with语句的主要优势，它确保我们的文件会被关闭，而不用关注嵌套代码如何退出。
#
# 上下文管理器的一个常见用例，是资源的加锁和解锁，以及关闭已打开的文件（就像我已经展示给你看的）。
#
# 让我们看看如何来实现我们自己的上下文管理器。这会让我们更完全地理解在这些场景背后都发生着什么。